import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import client.Client;

import comm.ClientPriority;

public class ImageProcessingClient {
	private int nonFiles=0;

	Client client;
	private int numberOfTasks;
	private String[] files;

	public ImageProcessingClient() {
		// client = new Client(ClientPriority.NORMAL, 20, 2, "193.136.188.196",
		// 0,
		// "193.136.188.196", 0);
		client = new Client(ClientPriority.NORMAL, 20, 2, "localhost", 0,
				"localhost", 0);
	}

	private void init() {
		File sourceimage = new File("1000images");
		files = sourceimage.list();
		numberOfTasks = files.length;

		long time = System.currentTimeMillis();

		new Thread(new Runnable() {


			@Override
			public void run() {
				for (int i = 0; i < numberOfTasks; i++) {
					try {
						File file = new File("1000images" + File.separator
								+ files[i]);
						if (file.isFile()) {
							byte[] image = getBytesFromFile(file);
							ImageProcessingTask task = new ImageProcessingTask(
									i, image);
							client.commit(task);
							// task.run();
							//
							// ImageProcessingResult result =
							// (ImageProcessingResult) task
							// .getResult();
							// try {
							// FileOutputStream out = new FileOutputStream(
							// "ImageResults" + File.separator + "output"
							// + result.getId()+".jpg");
							// out.write(result.getImage());
							// out.close();
							// } catch (FileNotFoundException e) {
							// // TODO Auto-generated catch block
							// e.printStackTrace();
							// } catch (IOException e) {
							// // TODO Auto-generated catch block
							// e.printStackTrace();
							// }
						} else {
							nonFiles++;
							//i--;
						}
					} catch (FileNotFoundException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

				}

			}

		}).start();

		for (int i = 0; i < numberOfTasks-nonFiles; i++) {
			ImageProcessingResult result = (ImageProcessingResult) client
					.getNextResult();
			try {
				FileOutputStream out = new FileOutputStream("ImageResults"
						+ File.separator + "output" + result.getId() + ".jpg");
				out.write(result.getImage());
				out.close();
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println(numberOfTasks + "("+i+")"+"-" + result.getId() + ":"
					+ (System.currentTimeMillis() - time));
		}
		System.out.println("Total time:" + (System.currentTimeMillis() - time));
		System.exit(0);
	}

	public byte[] getBytesFromFile(File file) throws IOException {
		InputStream is = new FileInputStream(file);

		// Get the size of the file
		long length = file.length();

		// You cannot create an array using a long type.
		// It needs to be an int type.
		// Before converting to an int type, check
		// to ensure that file is not larger than Integer.MAX_VALUE.
		if (length > Integer.MAX_VALUE) {
			// File is too large
		}

		// Create the byte array to hold the data
		byte[] bytes = new byte[(int) length];

		// Read in the bytes
		int offset = 0;
		int numRead = 0;
		while (offset < bytes.length
				&& (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) {
			offset += numRead;
		}

		// Ensure all the bytes have been read in
		if (offset < bytes.length) {
			throw new IOException("Could not completely read file "
					+ file.getName());
		}

		// Close the input stream and return bytes
		is.close();
		return bytes;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new ImageProcessingClient().init();

	}

}
